#include "DescriptionFichier.hpp"

#include <QtCore/QFile>
#include <QtXml/QDomDocument>

#include <iostream>

using namespace std;

DescriptionFichier::DescriptionFichier( const QString& nomFichier,
					QObject * parent )
  : QObject( parent ), InitialisationEffectuee( false ),
    NomFichierDescriptif( nomFichier )
{}

DescriptionFichier::~DescriptionFichier()
{}

unsigned DescriptionFichier::chargerDescription()
{
  QFile description( NomFichierDescriptif );

  if ( ! description . open( QIODevice::ReadOnly | QIODevice::Text ) )
    {
      cerr << "Impossible d'ouvrir le fichier '"
	   << NomFichierDescriptif . toUtf8() . constData()
	   << "' en lecture seule pour " << "mode texte." << endl;
      return 15u;
    }

  QDomDocument decodeur;

  if ( ! decodeur . setContent( &description ) )
    {
      cerr << "Impossible de charger la structure DOM" << endl;
      description . close();
      return 15u;
    }

  description . close();

  QString clef;
  QStringList valeurs, noms;

  noms << "element" << "attribut" << "nom";

  QDomNodeList elements = decodeur . elementsByTagName( noms[ 0 ] ), enfants;

  QDomNamedNodeMap attributs;
  
  QDomNode parent, enfant;

  int nbrElements( elements.count() ), iElement, nbrEnfants, iEnfant;

  for ( iElement = 0; iElement != nbrElements; iElement++ )
    {
      parent = elements . at( iElement );

      enfants = parent . childNodes();

      attributs = parent . attributes();

      if ( ! attributs . contains( noms[ 2 ] ) )
	{
	  cerr << "Manque le nom pour un élément" << endl;
	  return 16u;
	}

      clef = attributs . namedItem( noms[ 2 ] ) . toAttr() . value();

      ListeBalises . insert( clef );

      nbrEnfants = enfants.count();

      for ( iEnfant = 0; iEnfant != nbrEnfants; iEnfant++ )
	{
	  enfant = enfants . at( iEnfant );

	  if ( ! enfant . isElement() )
	    continue;

	  attributs = enfant . attributes();

	  if ( ! attributs . contains( noms[ 2 ] ) )
	    {
	      cerr << "Manque le nom pour un attribut" << endl;
	      return 16u;
	    }

	  valeurs << attributs . namedItem( noms[ 2 ] ) . toAttr() . value();
	}

      ListeAttributs . insert( clef, valeurs );

      valeurs.clear();
    }

  InitialisationEffectuee = true;

  return 0;
}

const bool& DescriptionFichier::initialisationEffectuee() const
{
  return InitialisationEffectuee;
}

void DescriptionFichier::affichageCompletContenu() const
{
  cout << "Liste des balises considérées :" << endl;
  foreach( QString str, ListeBalises )
    cout << str . toUtf8() . constData() << " ";

  cout << endl << endl;

  QList< QString > clefs = ListeAttributs . keys();
  QString clef, tmp;

  cout << "Liste des attributs considérés pour chaque balise :" << endl;
  foreach ( clef, clefs )
    {
      cout << clef . toUtf8() . constData() << " :" << endl;
      foreach ( tmp, ListeAttributs[ clef ] )
	cout << " - " << tmp . toUtf8() . constData() << endl;
      cout << endl;
    }
}

const QSet< QString >* DescriptionFichier::listeBalises() const
{
  return &ListeBalises;
}

const QHash< QString, QStringList >* DescriptionFichier::listeAttributs() const
{
  return &ListeAttributs;
}

